Tiny FORTRAN FORM ――――――――――――――――――――――――――――――――――――――― I/O 1980年 5、6、7、8、9月号掲載 MZ−80 マシン語 起動方法 モニタからロード ――――――――――――――――――――――――――――――――――――――― [5]リンク・パッケージとエディタ 皆さん、FORMの調子はいかがですか。 前々回のFORMコンパイラ部アセンブル・リストで E(エクスターナル)メッセージが出ていましたが、 これはFORMのリンク・パッケージを呼んでいるためです。 今回は、このリンク・パッケージのリストを公開します。 また、付録的ですがFORMエディタのリストも載せておきます。 ―――――――――――――――――――     1.リンク・パッケージ ――――――――――――――――――― リンク・パッケージは、 オブジェクトのセーブを行なうときにいっしょにつくパッケーシです。 このバッケージはあらかじめ、リンク済みですから、 FORMコンパイラからも一部利用しています。 リンク・パッケージは次にあげる13種類です。 ・―――――――――――――――――――――――・ | (1) 16bitの乗算            | | (2) 16bitの除算(符号無)       | | (3) 16bitの除算(符号有)       | | (4) 絶体値(ABS)           | | (5) 符号・反転              | | (6) 乱数の発生(RND)         | | (7) 配列用サブルーチン(1次元、2次元) | | (8) 擬似グラフィック関係         | | (9) USR関数用サブルーチン       | | (10) キーからの入力、CRTの出力     | | (11) 文字列の表示             | | (12) プリンタ・ルーチン          | | (13) 各関数用サブルーチン         | ・―――――――――――――――――――――――・ 各プログラムに関して詳細な解説を加えるとくどくなるので、 概要だけにとどめ、 後は読者の皆さんがプログラムをゆっくり読んでください。 まず数値演算のパッケーシですが、 乗算および除算は、ごく一般的なアルゴリズムなので、 プログラムを見れば一目瞭然のことと思います。 乗算、除算はともにシフト方式です。 データは、HL、DEに持ってきて結果をDEにストアします。 除算のときはHLに余りをストアするようになっています。 乱数は Z80CPU内のリフレッシュ・レジスタを使用して発生させています。 擬似グラフィック用サブルーチンは、SET、RESETのみですが、 グラフィックのリードのサブルーチンも同じようにして、 簡単に作ることができます。 FORMでなぜリードのサブルーチンを使用しなかったかは、 文法上で追加は可能であっても追加する必要性も感じなかったからです。 MZ−80のグラフィックについては前回も解説したので特に行ないません。 データはHとLにパラメータをセットしてCALLすれば、 セットまたはリセットしてくれます。 USR関数 はCPUのレジスタを設定することが可能になっています。 また、リターン時のレジスタも退避しています。 上記の2つのことをするため若干のテクニックを使用しているので 何かの参考にしてください。 KEY入力、CRT出力(数値)は バッファに一時溜めるようなことはしていません。 つまり、1文字入力または出力するときに数値を処理しています。 文字列表示はCALLのニモニックの次から文字列が展開されています。 文字列の終わりに00Hがあり、 その00Hで文字列の終わりを知り、 その次のアドレスヘリターンするようになっています。 プリンタ・ルーチンは、プリンタのエラーチェックのために、 特別なことはいっさいしてありません。 したがって、プリンタ出力中にプリンタの電源が落ちても復旧するまで、 いつまでも待っています。 各関数および配列で使用しているサブルーチンは解説していくと 誌面の無駄使いになるので省くことにします。 以上が、リンク・パッケージの概要です。 ―――――――――――――――――――       2.エディタ ――――――――――――――――――― エディタ部はFORMのメモリ構成上特殊な構造を持っています。 テキストはメモリの後部から上位アドレス(0番地)へ 向かって作成されます。 つまり、テキスト・エリアを後部から 上位アドレスヘ向かって作成することにより、 メモリの使用効率を上げ、オブジェクト・プログラムの出力が テキスト・エリアによって制限されるのを極力抑えているのです。 しかも、ポインタを変更することによリ、 簡単にテキスト・エリアを移動することか可能となっています。 FORMが20Kから48Kシステムで稼動可能なのは、 このエディタかあるからです。 エディタから出力されるテキスト・ファイルは、 シャープのテキスト・エディタ(SP−2201)と 同じフォーマットになっています。 したがって、FORMエディタで アセンブラ・テキストを作成して、 シャープのアセンブラ(SP−2101)で、 アセンブルも可能です。 また、その逆にテキスト・エディタで FORMプログラムを作成して、 FORMでコンパイルも可能なわけです。 読者の皆さんの内でアセンブラを持っている方は、 一度FORMエディタを使用して アセンブルしてみてください。 ―――――――――――――――――――    3.文法の追加について ――――――――――――――――――― 前々回のアセンブル・リストを見ると気付くと思いますが、 FORMには発表してない文法があります。 その1つは$ML文です。 この文は、以後示される『,』で区切られた16進数を オブジェクト内にそのまま出力します。 つまり、マシン語をそのまま使用することが可能になっているのです。 FORMがいくらコンパイラだといっても、 マシン語に劣る部分が多々あります。 マシン語を使用することによりZ80CPUの特種な命令を使い、 プログラム効率を上げることができます。 ただし、このマシン語はリロケータブルに動作するものに限定されます。 何故ならば、コンパイルが終了するまで 正確なアドレスは決定されてないからです。 この文を使用するときは注意をしてください。 もう一つは、文字定数があります。 たとえば、 ・―――――――――――――――――・ | #_              | ・―――――――――――――――――・ のときに『#』の次にくる文字を 8ビットの数値として使用することが可能です。 ただし文末のときは、『#』の次にスペースを入れると エディタがそのスペースを受け付けません。 したがって、文末で文字定数のスペースは使用できません。 以上、2つが文法の末発表部分です。 ―――――――――――――――――――    4.FORMIIについて ――――――――――――――――――― 現在、FORMIIを作成するかどうかは、決っていませんが、 筆者としては、ぜひFORMIIを作成したいと思っています。 現状では他の仕事もありそんな余裕はありませんが、 いつかきっと作成したいと思います。 言語仕様としては、現行のFORMの上位バージョンとして、 文法はなるべく変更しないで、ステートメントをもっと充実させ、 もっと効率よくコンパイルを行なうようにしたいと思います。 ―――――――――――――――――――   5.FORMバリエーション ――――――――――――――――――― 読者の皆さんの多くも、1200H番地からオブジェクトが出力されたら 良いと思っていると思われるので、 いま私が使用しているFORMバリエーションの作成の方法を発表しましょう。 まず、FORMバリエーションを作成するのに必要なものは、 シャープのアセンブラとシンボリック・デバッガとテキスト・エディタです。 FORMのアセンブラ・リストを3部とも別々に打ち込んで、 アセンブラでリロケータブル・バイナリ(RB)を作成してください。 次に、シンボリック・デバッガでコンパイラ部を 実行アドレス、ロード・アドレスともB600H番地でリンクします。 次にエディタ部をコンパイラ部に続けてリンクします。 そして、リンク・パッケージを実行アドレスを1200H番地、 ロード・アドレスをB000H番地でリンクします。 次に、B61BH番地をB5Hに変更します。 そして、AF00番地から次のプログラムを打ち込んでください。 ・―――――――――――――――――・ |  LD HL,           | |  LD DE,           | |  LD BC,0600H         | |  LDIR             | |  JP B600H          | ・―――――――――――――――――・ そして、AF000H〜CFFFH番地までを AF00から実行するようにカセットにセーブしてください。 これでFORMバリエーションのでき上りです。 ただし48Kのメモリを必要とします。 皆さんどうですか? それではこの辺で、これからもFORMをよろしく!